Computer software programs can be analyzed to identify bugs, to verify correct operation of the programs, or to develop metrics that describe the programs. For example, programs can be manually analyzed at the source code level by individual programmers. Automated techniques for analyzing code also exist, and can be broadly categorized into two groups, static analysis and dynamic analysis.
Static analysis techniques evaluate code by using logical and symbolic techniques to reason about the behavior of the program on different inputs, without necessarily running the program. For example, static analysis can evaluate how program variables are modified in different ways when a program uses different control paths. In contrast, dynamic analysis techniques operate by executing the program with different test inputs to see how the program behaves for different inputs. For example, dynamic analysis techniques can evaluate runtime variables of a program across one or more program executions.